【小ネタ】AWS CLIでS3のPre-Signed URLを生成できるようになっていました!

【小ネタ】AWS CLIでS3のPre-Signed URLを生成できるようになっていました!

Clock Icon2016.09.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。およそ1ヶ月前にリリースされていた機能なので、ブログに書くには遅すぎた感もありますが、社内担当で知らない者もいたので、小ネタですが書いておこうと思います。

最新版のAWS CLIを使えば、Pre-Signed URLを簡単に生成できるようになっています。正確には、aws s3コマンドのサブコマンドとして、v1.10.59からpresignが追加されていますので、こちらの機能をご紹介したいと思います。

  • 1.10.59
    • feature:s3: Add a new aws s3 presign command, closes #462

aws-cli/CHANGELOG.rst at develop · aws/aws-cli

Pre-Signed(署名付き) URLとは?

Pre-Signed URLとは、S3上のオブジェクトに期限付きURLを生成する機能です。正確には、アップロードとダウンロードの2種類があるのですが、今回AWS CLIで利用できるようになった機能は、GET(ダウンロード)の方だけのようです。

AWS SDK他を利用した署名付きURLの生成が少々面倒だった経緯について、下記ページをざっとご覧いただければおわかりいただけるかと思います。S3のAPIベースの操作では実現できない為、AWS SDKでも対応状況がバラバラというのが現状です。非常に便利で有用な機能であるのにも関わらず、開発者以外の方が利用するには敷居が高い状況だったのではないでしょうか?

AWS CLIでPre-Signed URLを生成してみる

基本的な使い方

それでは使い方を簡単に確認して、試してみます。今回の機能はGET専用なので、既にS3に配置したオブジェクトのダウンロード用URLが生成されるイメージとなります。まずは、事前にオブジェクトを配置しておきます。Pre-Signed URLを生成するIAMユーザには、S3ReadOnlyだけ付与しておけば問題無く動作しました。

$ aws sts get-caller-identity
{
    "Account": "697xxxxxx005",
    "UserId": "AIDAxxxxxxxxxxxxSTPC",
    "Arn": "arn:aws:iam::697xxxxxx005:user/testuser"
}

$ aws s3 ls s3://test-697xxxxxx005-bucket/sample.txt
2016-09-21 14:01:12         16 sample.txt

このオブジェクトには、特別なACLやバケットポリシーは設定されていません。その為、そのままこのオブジェクトのリンクURLにアクセスしても当然アクセスすることができません。

s3_sample_1

s3_sample_2

それでは、Pre-Signed URLを生成してみます。コマンドは非常にシンプルです。

$ aws s3 presign help

PRESIGN()

NAME
       presign -

DESCRIPTION
       Generate  a  pre-signed URL for an Amazon S3 object. This allows anyone
       who receives the pre-signed URL to retrieve the S3 object with an  HTTP
       GET request.

SYNOPSIS
            presign
          <S3Uri>
          [--expires-in <value>]

OPTIONS
       path (string)

       --expires-in  (integer)  Number  of  seconds  until  the pre-signed URL
       expires. Default is 3600 seconds.


                                                                     PRESIGN()

他のaws s3コマンドと同じようにS3オブジェクトのパスを指定して、--expires-inで有効期限を指定するだけです。指定なし(デフォルト)では、1h(= 60s x 60)となります。それでは試してみます。

$ date
2016年 9月21日 水曜日 16時21分36秒 JST

$ aws s3 presign s3://test-697xxxxxx005-bucket/sample.txt --expires-in 60
https://test-697xxxxxx005-bucket.s3.amazonaws.com/sample.txt

URL内のExpiresで指定された数値が、UNIXTIMEで表現された有効期限です。

$ date -r 1474442558
2016年 9月21日 水曜日 16時22分38秒 JST

無事にアクセスできました。

s3_sample_3

しばらくすると、アクセスができなくなりました。想定通りですね。(※ブラウザキャッシュクリアが必要な場合がありました)

s3_sample_4

まとめ

ちょっとしたリリースなのですが、一時的なファイルの受け渡しに利用する等、AWSの利用可能性の広がるアップデートではないかと思います。まだ試したことが無い方はぜひ試してみてください。

どこかの誰かのお役に立てば嬉しいです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.